/*************************************************************************
	> File Name: sigsuspend.c
	> Author: Angel Criss
	> Blog: blog.abbycin.tk 
	> Created Time: Sun 22 Jun 2014 08:43:08 PM CST
 ************************************************************************/

#define _GNU_SOURCE
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>

int quit=0;

void deing(int sig)
{
    printf("dealing with signal:%d\n",sig);
    if(sig==SIGQUIT)
        quit=1;
}

int main(int argc,char *argv[])
{
    printf("%s's PID: %d\n",argv[0],getpid());

    struct sigaction act;
    sigset_t set,oldset;

    sigemptyset(&act.sa_mask);
    sigemptyset(&set);

    sigaddset(&set,SIGINT);
    sigaddset(&set,SIGQUIT);
    
    act.sa_handler=deing;
    act.sa_flags=0;
    
    sigprocmask(SIG_BLOCK,&set,&oldset); //add a sigblock and save its orignal set

    //sigaction(SIGTERM,&act,NULL); //由于37行没有阻塞SIGTERM所以不用等sigsuspend解除(或者说sigsuspend就是多余的)
    sigaction(SIGINT,&act,NULL);
    sigaction(SIGQUIT,&act,NULL);
/*
 * 先前用37行阻塞了SIGINT,SIGQUIT
 * 接下来在循环中用sigsuspend解除对以上两个信号的
 * 阻塞,并等待信号(sigaction中的)以调用dealing处理器函数
 */
    int i;
    for(i=1;!quit;i++) // 非真则退出循环
    {
      //  sleep(3);
        printf("\e[42m Before sigsuspend\e[0m\n");
        sigsuspend(&oldset); // unblock &set
        printf("已经解除了对SIGINT和SIGQUIT的阻塞\n\e[36m为什么这行会在已经处理了信号才打印出来\n是因为sigsuspend在解除阻塞后会等待一个信号(相当于pause())\n一旦遇到信号有跳到dealing去执行,完了才回来打印\e[0m\n"); //如果sigaction不是处理这两个信号的话\可以用这两个信号将进程杀死(\
        由于没有对这两个信号设置处理函数则按照默认方式处理SIGDEL就是将进程杀死)
        printf("this is in %d loop\n",i);
    }
    sigprocmask(SIG_SETMASK,&oldset,NULL); // restore the old set
    printf("the oldset is %d\n",oldset);
    exit(0);
}
